package hipoteca;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="tabla")
public class Hipoteca {
    	@XmlElement
	private double cantidad;
    	@XmlElement
	private int anyos;
    	@XmlElement
	private double tipo;
    	@XmlElement
	private double importeMensualidad;
	private double cantidadPendiente;
	private double totalIntereses;
	@XmlElementWrapper(name="mensualidades")
	@XmlElement(name="mensualidad")
	private List<Mensualidad> mensualidades;

	public Hipoteca() {
		super();
		anyos = 0;
		tipo = cantidad = 0.0;
	}

	public Hipoteca(int anyos, double tipo, double cantidad) {
		super();
		this.anyos = anyos;
		this.tipo = tipo;
		this.cantidad = cantidad;
	}

	public void calcularHipoteca() {
		mensualidades = new ArrayList<Mensualidad>();
		importeMensualidad = calcularImporteMensual();
		cantidadPendiente = cantidad;

		for (int i = 0; i < 12 * anyos; i++) {
			mensualidades.add(new Mensualidad());
			mensualidades.get(i).calcularMensualidad(tipo, cantidadPendiente,
					importeMensualidad);
			cantidadPendiente -= mensualidades.get(i).getCapitalAmortizado();
			totalIntereses += mensualidades.get(i).getInteresPagado();
		}
	}

	private double calcularImporteMensual() {
		return (cantidad * (tipo / 1200))
				/ (1 - (1 / (Math.pow((1 + (tipo / 1200)), (12 * anyos)))));
	}

	public String mostrarTablaAmortizacion() {
		/*
		 * Ver con Oscar como se "tabula" una salida de este tipo.
		 */
		cantidadPendiente = cantidad;
		StringBuffer tabla = new StringBuffer();

		tabla.append(" PENDIENTE MENSUALI. INTERESES AMORTIZA. PENDIENTE\n");
		tabla.append(" ========= ========= ========= ========= =========\n");
		for (Mensualidad m : mensualidades) {
			tabla.append(String.format("%10.2f", cantidadPendiente));
			tabla.append(String.format("%10.2f", importeMensualidad));
			tabla.append(m.toString());
			cantidadPendiente -= m.getCapitalAmortizado();
			tabla.append(String.format("%10.2f", cantidadPendiente) + "\n");
		}
		return tabla.toString();
	}

	@Override
	public String toString() {
		return "Hipoteca\n========\nCantidad=" + cantidad + "\nMensualidades="
				+ anyos * 12 + "\nTipo=" + tipo + "%"
				+ "\nImporte Mensualidad="
				+ String.format("%.2f", importeMensualidad)
				+ "\nTotal Intereses=" + String.format("%.2f", totalIntereses);
	}
}
